package com.util.mapdemo;

import com.stream.Student;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.StringJoiner;
import java.util.StringTokenizer;
import java.util.stream.Collectors;

/**
 * @Author:zxh
 * @Description: StringTokenizer, StringJoiner 练习
 * @Date: 2020/10/30
 * @Modified By:
 */
public class StringJoinerDemo {

    /**
     * StringTokenizer是由于兼容性原因而保留的遗留类，尽管在新代码中不鼓励使用它。 建议任何寻求此功能的人都使用String的split或java.util.regex包替代
     */
    public void stringTokenizerDemo() {
        // 它只能靠构造函数把分隔符传进去
        // 若不指定分隔符，默认使用" \t\n\r\f"去分割
        StringTokenizer stringTokenizerOne = new StringTokenizer("He llo Geek How are you");
        while (stringTokenizerOne.hasMoreElements()) {
            System.out.println("stringTokenizerOne: " + stringTokenizerOne.nextToken());
        }
        //测试此令牌化程序的字符串是否有更多的令牌可用。 如果此方法返回true ，则后续调用不带参数的nextToken将成功返回令牌
        //注意分隔符的使用规则
        StringTokenizer stringTokenizerTwo = new StringTokenizer("Hello :Ge,ek :How:are you", " :,");
        while (stringTokenizerTwo.hasMoreTokens()) {
            System.out.println("stringTokenizerTwo: " + stringTokenizerTwo.nextElement());
        }

        /**
         * 为指定的字符串构造一个字符串tokenizer。 delim参数中的所有字符都是用于分隔标记的分隔符。
         如果returnDelims标志为true ，则分隔符字符也作为标记返回。 每个分隔符作为长度为1的字符串返回。 如果标志为false ，则跳转分隔符，并仅在令牌之间作为分隔符。
         请注意，如果delim为null ，则此构造函数不会抛出异常。 然而，试图调用其他方法对结果StringTokenizer可能会导致一个NullPointerException
         */
        StringTokenizer stringTokenizerThree = new StringTokenizer("Hello,Geek,How :are you", ",", true);
        while (stringTokenizerThree.hasMoreTokens()) {
            System.out.println("stringTokenizerThree: " + stringTokenizerThree.nextElement());
        }
    }

    /**
     * 以下示例说明了如何使用String.split方法将字符串分解为其基本令牌
     * todo 熟悉regex
     */
    public void splitTest() {
        String[] result = "this is a test".split("\\s");
        for (int x = 0; x < result.length; x++)
            System.out.println(result[x]);
    }


    /*************************  StringJoiner *******************************************/
    /**
     * StringJoiner用于构造由分隔符分隔的字符序列，并且可选地从提供的前缀开始，并以提供的后缀结尾。
     * 2.它主要就是掌握构造函数+add这个方法
     */
    public void stringJoinerTest() {
        String[] str = {"wo", "ai", "ni"};

        // 使用原始的StringBuider方式~
        StringBuilder sb = new StringBuilder();
        Arrays.stream(str).forEach(s -> {
            sb.append(s);
            sb.append(",");
        });
        System.out.println("stringBuilder: " + sb.substring(0, sb.lastIndexOf(",")));

        // String内置的工具类方式  它底层还是使用的StringBuilder
        System.out.println();

        //使用StringJoiner
        StringJoiner stringJoiner = new StringJoiner(",");
        Arrays.stream(str).forEach(s -> {
            stringJoiner.add(s);
        });
        System.out.println("stringJoiner: " + stringJoiner);
    }

    public void stringJoinerTwo() {
        StringJoiner sj = new StringJoiner(":", "[", "]");
        sj.add("Georg").add("Sally").add("Fred");
        String string = sj.toString();
        System.out.println("StringJoiner: " + string);

        //StringJoiner可以用来创建从格式化输出Stream使用Collectors.joining(CharSequence)
        List<Integer> asList = Arrays.asList(1, 2, 3, 4, 5);
        String collect = asList.stream().map(i -> i.toString()).collect(Collectors.joining(",", "(", ")"));
        System.out.println("Collectors.joining: " + collect);

    }

    public static void main(String[] args) {
        //new StringJoinerDemo().stringTokenizerDemo();
        // new StringJoinerDemo().splitTest();
        //new StringJoinerDemo().stringJoinerTest();
        //new StringJoinerDemo().stringJoinerTwo();
        String str = "a101020700000000";
        System.out.println(str.substring(0,str.length()-6));
        Student s = null;
        if (s == null) {

        }
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime localDateTime = null;
        System.out.println("ww:"+now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))+" week:"+now.minusWeeks(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        boolean empty = StringUtils.isEmpty(s);

        List<String> list = null;
        System.out.println("one: "+list.isEmpty());

    }

}
